package com.google.code.gronono.gps.model;

import java.io.File;

import org.apache.commons.lang.StringUtils;

/**
 * Classe d'association entre un fichier source et un fichier destination.
 * @author Arnaud BRUNET
 */
public class SortedFile implements Comparable<SortedFile> {
	/** Le fichier source */
	private final File srcFile;
	/** Le fichier de destination */
	private File dstFile;

	/** Le message d'erreur */
	private String errorMsg;
	/** La cause de l'erreur */
	private String errorCause;

	/**
	 * Constructeur.
	 * @param srcFile Le fichier source
	 */
	public SortedFile(final File srcFile) {
		this(srcFile, null);
	}

	/**
	 * Constructeur
	 * @param srcFile Le fichier source
	 * @param dstFile Le fichier de destination
	 */
	public SortedFile(final File srcFile, final File dstFile) {
		this.srcFile = srcFile;
		this.dstFile = dstFile;
	}

	/**
	 * @return <code>true</code> si les fichiers sources sont identiques (au sens {@link File#equals(Object)}.
	 *
	 * @see File#equals(Object)
	 */
	@Override
	public boolean equals(final Object obj) {
		if (obj == this) {
			return true;
		}
		if (obj.getClass().equals(SortedFile.class)) {
			return ((SortedFile) obj).getSrcFile().equals(srcFile);
		}
		return false;
	}

	/**
	 * @return Le hashCode du fichier source.
	 * @see File#hashCode()
	 */
	@Override
	public int hashCode() {
		return srcFile.hashCode();
	}

	/**
	 * Donne le message d'erreur de l'association.
	 * @return Le message d'erreur.
	 */
	public String getErrorMsg() {
		return errorMsg;
	}

	/**
	 * Change le message d'erreur.
	 * @param errorMsg Le nouveau message d'erreur.
	 */
	public void setErrorMsg(final String errorMsg) {
		this.errorMsg = errorMsg;
	}

	/**
	 * Donne la cause de l'erreur.
	 * @return La cause d'erreur.
	 */
	public String getErrorCause() {
		return errorCause;
	}

	/**
	 * Change la cause de l'erreur.
	 * @param errorCause La nouvelle cause d'erreur.
	 */
	public void setErrorCause(final String errorCause) {
		this.errorCause = errorCause;
	}

	/**
	 * Donne le fichier source.
	 * @return Le fichier source.
	 */
	public File getSrcFile() {
		return srcFile;
	}

	/**
	 * Change le fichier de destination.
	 * @param dstFile Le nouveau fichier de destination.
	 */
	public void setDstFile(final File dstFile) {
		this.dstFile = dstFile;
	}

	/**
	 * Donne le fichier de destination.
	 * @return Le fichier de destination.
	 */
	public File getDstFile() {
		return dstFile;
	}

	/**
	 * Permet de savoir si l'association est en erreur.
	 * @return <code>true</code> Si le message d'erreur n'est pas <code>null</code>, <code>false</code> sinon.
	 */
	public boolean hasError() {
		return StringUtils.isNotBlank(errorMsg);
	}

	/**
	 * @return le résultat de la comparaison sur les fichiers sources.
	 *
	 * @see Comparable#compareTo(Object)
	 */
	public int compareTo(final SortedFile o) {
		return getSrcFile().getAbsoluteFile().compareTo(o.getSrcFile());
	}

	/*
	 * (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return getSrcFile() + " -> " + getDstFile() + " : " + getErrorMsg();
	}

}
